home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / demo-versionen / maxoncpp4-demo / demo / supercode / prefs.c < prev    next >
C/C++ Source or Header  |  1996-12-31  |  19KB  |  842 lines

  1. //-------------------------------------
  2. //
  3. // SuperCode (c) 1996 by T.Kühn 
  4. //
  5. // Programmiersprache:    ANSI-C
  6. // Projektstart:            27.12.94
  7. //
  8. // Modul:                Preferences
  9. //
  10. //-------------------------------------
  11.  
  12.  
  13.  
  14.  
  15.  
  16. //-------------------------------------
  17.  
  18. #include <pragma/asl_lib.h>
  19. #include <pragma/graphics_lib.h>
  20. #include <pragma/intuition_lib.h>
  21. #include <pragma/dos_lib.h>
  22. #include <pragma/exec_lib.h>
  23. #include <pragma/gadtools_lib.h>
  24. #include <libraries/gadtools.h>
  25. #include <libraries/asl.h>
  26. #include <intuition/gadgetclass.h>
  27. //#include <graphics/displayinfo.h>
  28.  
  29. #include <Struct.h>
  30.  
  31. //-------------------------------------
  32.  
  33. struct tkPrefs        prg_preferences,*prg_prefs=&prg_preferences;
  34. struct tkPrefs        cpy_preferences,*cpy_prefs=&cpy_preferences;
  35.  
  36. struct Window *window_prefs=0;
  37.  
  38. enum id
  39. {
  40.     ID_NONE,
  41.     ID_COLORS,
  42.     ID_COLUMNS,
  43.     ID_EQUAL,
  44.     ID_ORDER,
  45.     ID_DISPLAY,
  46.     ID_NOVICE,
  47.     ID_AMATURE,
  48.     ID_EXPERT,
  49.     ID_END
  50. };
  51. //-------------------------------------
  52. void prefs_init()
  53. {
  54.     struct Screen *scr=LockPubScreen(PUB_WB);
  55.  
  56.     prg_prefs->game.num_columns=4;
  57.     prg_prefs->game.num_colors=    6;
  58.     prg_prefs->game.max_equal=    1;            // > 0
  59.     prg_prefs->game.val_order=    ORDER_DESC;
  60.     prg_prefs->game.display=        DISPLAY_COLORS;
  61.  
  62.     if (scr)
  63.     {
  64.         prg_prefs->scr.scr_mode=GetVPModeID(&scr->ViewPort);
  65.         prg_prefs->scr.scr_width=scr->Width;
  66.         prg_prefs->scr.scr_height=scr->Height;
  67.         UnlockPubScreen(0,scr);
  68.     }
  69.     else
  70.     {
  71.         prg_prefs->scr.scr_mode=LIKE_WORKBENCH;
  72.         prg_prefs->scr.scr_width=640;
  73.         prg_prefs->scr.scr_height=512;
  74.     }
  75.     prg_prefs->scr.scr_depth=3;
  76.     prg_prefs->scr.scr_overscan=OSCAN_TEXT;
  77.     prg_prefs->scr.scr_public=TRUE;
  78.  
  79.     strcpy(prg_prefs->game.player_name,"Nobody");
  80.     strcpy(prg_prefs->game.save_file,"Save/SuperSave.001");
  81.     strcpy(prg_prefs->scr.scr_pubname,PUB_WB);
  82.  
  83. //    strcpy(prg_prefs->scr.fontname,"CGTimes.font");
  84. //    prg_prefs->scr.fontattr.ta_YSize=30;
  85.  
  86.     strcpy(prg_prefs->scr.fontname,scr->Font->ta_Name);
  87.     prg_prefs->scr.fontattr.ta_YSize=scr->Font->ta_YSize;
  88.  
  89.     prg_prefs->scr.fontattr.ta_Name=prg_prefs->scr.fontname;
  90.  
  91.     prg_prefs->win.game.Xpos=20;
  92.     prg_prefs->win.game.Ypos=20;
  93.     prg_prefs->win.game.WinW=250;
  94.     prg_prefs->win.game.WinH=300;
  95.  
  96.     prg_prefs->win.score.Xpos=270;
  97.     prg_prefs->win.score.Ypos=20;
  98.     prg_prefs->win.score.WinW=250;
  99.     prg_prefs->win.score.WinH=300;
  100.  
  101.     prg_prefs->win.prefs.Xpos=10;
  102.     prg_prefs->win.prefs.Ypos=40;
  103.     prg_prefs->win.prefs.WinW=270;
  104.     prg_prefs->win.prefs.WinH=200;
  105.  
  106.     prg_prefs->win.font.Xpos=20;
  107.     prg_prefs->win.font.Ypos=20;
  108.     prg_prefs->win.font.WinW=250;
  109.     prg_prefs->win.font.WinH=200;
  110.  
  111.     prg_prefs->win.file.Xpos=20;
  112.     prg_prefs->win.file.Ypos=20;
  113.     prg_prefs->win.file.WinW=250;
  114.     prg_prefs->win.file.WinH=200;
  115.  
  116.     prg_prefs->win.scrn.Xpos=20;
  117.     prg_prefs->win.scrn.Ypos=20;
  118.     prg_prefs->win.scrn.WinW=200;
  119.     prg_prefs->win.scrn.WinH=200;
  120.  
  121.     prefs_load();
  122. };
  123. //-------------------------------------
  124. void prefs_free()
  125. {
  126.     prefs_windowclose();
  127. //    prefs_save();
  128. };
  129. //-------------------------------------
  130.  
  131.  
  132.  
  133. //-------------------------------------
  134. LONG prefs_askscreen()
  135. {
  136.     struct ScreenModeRequester *request;
  137.     LONG back=FALSE;
  138.  
  139.     request=AllocAslRequest(ASL_ScreenModeRequest,0);
  140.     if (request)
  141.     {
  142.         LONG mode= prg_prefs->scr.scr_mode;
  143.  
  144.         back=AslRequestTags(request,
  145.             ASLSM_InitialLeftEdge,prg_prefs->win.scrn.Xpos,
  146.             ASLSM_InitialTopEdge,prg_prefs->win.scrn.Ypos,
  147.             ASLSM_InitialHeight,prg_prefs->win.scrn.WinW,
  148.             ASLSM_InitialWidth,prg_prefs->win.scrn.WinH,
  149.  
  150.             ASLSM_Window,0,
  151.             ASLSM_SleepWindow,0,
  152.  
  153.             ASLSM_Locale,0,
  154. //            ASLSM_NegativeText,(STRPTR),
  155. //            ASLSM_PositiveText,(STRPTR),
  156. //            ASLSM_TextAttr,(struct TextAttr *),
  157.             ASLSM_TitleText,CatStr(TXT_PREFSCREENMODE),
  158.  
  159.             ASLSM_InitialDisplayID,mode,
  160. //            ASLSM_InitialAutoScroll,TRUE,
  161.             ASLSM_InitialDisplayDepth,Scrn.Depth,
  162.             ASLSM_InitialDisplayWidth,Scrn.Width,
  163.             ASLSM_InitialDisplayHeight,Scrn.Height,
  164.             ASLSM_InitialOverscanType,Scrn.OverScan,
  165.  
  166. //            ASLSM_InitialInfoLeftEdge (WORD)
  167. //            ASLSM_InitialInfoTopEdge (WORD)  [V38]
  168. //            ASLSM_InitialInfoOpened,TRUE,
  169. //            ASLSM_UserData (APTR)  [V38]
  170.  
  171. //            ASLSM_DoAutoScroll,TRUE,
  172.             ASLSM_DoDepth,TRUE,
  173.             ASLSM_DoHeight,TRUE,
  174.             ASLSM_DoWidth,TRUE,
  175.             ASLSM_DoOverscanType,TRUE,
  176. //            ASLSM_FilterFunc (struct Hook *)  [V38]
  177. //            ASLSM_MaxDepth (UWORD),
  178. //            ASLSM_MinDepth (UWORD)  [V38]
  179. //            ASLSM_MaxHeight (ULONG),
  180. //            ASLSM_MinHeight (ULONG)  [V38]
  181. //            ASLSM_MaxWidth (ULONG),
  182. //            ASLSM_MinWidth (ULONG)  [V38]
  183. //            ASLSM_PropertyFlags (ULONG),
  184. //            ASLSM_PropertyMask (ULONG)  [V38]
  185.  
  186.             TAG_END);
  187.  
  188.         prg_prefs->win.scrn.Xpos=request->sm_LeftEdge;
  189.         prg_prefs->win.scrn.Ypos=request->sm_TopEdge;
  190.         prg_prefs->win.scrn.WinW=request->sm_Width;
  191.         prg_prefs->win.scrn.WinH=request->sm_Height;
  192.  
  193.         if (back)
  194.         {
  195.             prg_prefs->scr.scr_width=request->sm_DisplayWidth;
  196.             prg_prefs->scr.scr_height=request->sm_DisplayHeight;
  197.             prg_prefs->scr.scr_depth=request->sm_DisplayDepth;
  198.             prg_prefs->scr.scr_mode=request->sm_DisplayID;
  199.             prg_prefs->scr.scr_overscan=request->sm_OverscanType;
  200.             prg_prefs->scr.scr_public=FALSE;
  201.         }
  202.         FreeAslRequest(request);
  203.     }
  204.     return back;
  205. }
  206. //-------------------------------------
  207. void prefs_setscreen()
  208. {
  209.     if (prefs_askscreen())
  210.     {
  211. //        prefs_settext();
  212.         Screen_Open(&Scrn);
  213.     }
  214. }
  215. //-------------------------------------
  216.  
  217.  
  218. //-------------------------------------
  219. LONG prefs_askfont(struct TextAttr *attr)
  220. {
  221.     struct FontRequester *request;
  222.     LONG back=FALSE;
  223.  
  224.     request=AllocAslRequest(ASL_FontRequest,0);
  225.     if (request)
  226.     {
  227.         back=AslRequestTags(request,
  228. //            ASLFO_Window,Win_Calc->WinPtr,
  229.             ASLFO_TitleText,CatStr(TXT_PREFSELECTFONT),
  230.             ASLFO_InitialDrawMode,JAM1,
  231.             ASLFO_InitialFlags,0,
  232.             ASLFO_InitialName,attr->ta_Name,
  233.             ASLFO_InitialSize,attr->ta_YSize,
  234.             ASLFO_InitialStyle,FS_NORMAL,
  235.             ASLFO_InitialLeftEdge,prg_prefs->win.font.Xpos,
  236.             ASLFO_InitialTopEdge,prg_prefs->win.font.Ypos,
  237.             ASLFO_InitialWidth,prg_prefs->win.font.WinW,
  238.             ASLFO_InitialHeight,prg_prefs->win.font.WinH,
  239.             TAG_END);
  240.  
  241.         prg_prefs->win.font.Xpos=request->fo_LeftEdge;
  242.         prg_prefs->win.font.Ypos=request->fo_TopEdge;
  243.         prg_prefs->win.font.WinW=request->fo_Width;
  244.         prg_prefs->win.font.WinH=request->fo_Height;
  245.  
  246.         if (back)
  247.         {
  248.             StrCopy(attr->ta_Name,request->fo_Attr.ta_Name,MAX_FONTNAME);
  249.             attr->ta_YSize=request->fo_Attr.ta_YSize;
  250.         }
  251.         FreeAslRequest(request);
  252.     }
  253.     return back;
  254. }
  255. //-------------------------------------
  256. void prefs_setfont()
  257. {
  258.     if (prefs_askfont(&prg_prefs->scr.fontattr))
  259.     {
  260. //        prefs_settext();
  261.         Screen_Open(&Scrn);
  262.     }
  263. }
  264. //-------------------------------------
  265.  
  266.  
  267. //-------------------------------------
  268. LONG prefs_askfile(UBYTE *title,UBYTE *filename,LONG size,LONG save)
  269. {
  270.     struct FileRequester *request;
  271.     LONG back=FALSE;
  272.     UBYTE drawer[FILENAME_MAX+2];
  273.  
  274.     strncpy(drawer,filename,MIN(size,FILENAME_MAX));
  275.     if (PathPart(drawer)) PathPart(drawer)[0]=0;
  276.  
  277.     request=AllocAslRequest(ASL_FileRequest,0);
  278.  
  279.     if (request)
  280.     {
  281.         back=AslRequestTags(request,
  282.             ASLFR_InitialLeftEdge,prg_prefs->win.file.Xpos,
  283.             ASLFR_InitialTopEdge,prg_prefs->win.file.Ypos,
  284.             ASLFR_InitialWidth,prg_prefs->win.file.WinW,
  285.             ASLFR_InitialHeight,prg_prefs->win.file.WinH,
  286.  
  287.             ASLFR_Screen,Scrn.Scrn,
  288.             ASLFR_Locale,locale,
  289.             ASLFR_TitleText,title,
  290.  
  291.             ASLFR_InitialFile,FilePart(filename),
  292.             ASLFR_InitialDrawer,drawer,
  293.  
  294.             ASLFR_DoSaveMode,save,
  295.             TAG_END);
  296.  
  297.         prg_prefs->win.file.Xpos=request->fr_LeftEdge;
  298.         prg_prefs->win.file.Ypos=request->fr_TopEdge;
  299.         prg_prefs->win.file.WinW=request->fr_Width;
  300.         prg_prefs->win.file.WinH=request->fr_Height;
  301.  
  302.         if (back)
  303.         {
  304.             StrCopy(filename,request->fr_Drawer,size);
  305.             AddPart(filename,request->fr_File,size);
  306.         }
  307.         FreeAslRequest(request);
  308.     }
  309.     return back;
  310. }
  311. //-------------------------------------
  312.  
  313.  
  314. struct Gadget *gadget_first=0,
  315.     *gadget_colors,
  316.     *gadget_equal,
  317.     *gadget_order,
  318.     *gadget_display,
  319.     *gadget_columns,
  320.     *gadget_novice,
  321.     *gadget_amature,
  322.     *gadget_expert;
  323.  
  324. UBYTE *text_order[4];
  325. UBYTE *text_display[3];
  326.  
  327. //-------------------------------------
  328. void gadget_newlook(struct Gadget *gad)
  329. {
  330.     while (gad)
  331.     {
  332.         if ( (gad->GadgetType & GTYP_PROPGADGET) && (gad->SpecialInfo) )
  333.             ((struct PropInfo*)gad->SpecialInfo)->Flags|=PROPNEWLOOK;
  334.         gad=gad->NextGadget;
  335.     }
  336. }
  337. //-------------------------------------
  338.  
  339. //-------------------------------------
  340. void prefs_copy(struct tkPrefs *src,struct tkPrefs *dst)
  341. {
  342.     if (dst && src)
  343.     {
  344.         memcpy(&dst->scr,&src->scr,sizeof(struct SetScreen));
  345.         memcpy(&dst->game,&src->game,sizeof(struct SetGame));
  346. //        memcpy(&dst->win,&src->win,sizeof(struct SetWindow));
  347.     }
  348. }
  349. //-------------------------------------
  350.  
  351. //-------------------------------------
  352. void prefs_freegadgets()
  353. {
  354.     if (gadget_first)
  355.     {
  356.         if (window_prefs) RemoveGList(window_prefs,gadget_first,-1);
  357.         FreeGadgets(gadget_first);
  358.  
  359.         if (gadget_novice) DisposeObject(gadget_novice);
  360.         if (gadget_amature) DisposeObject(gadget_amature);
  361.         if (gadget_expert) DisposeObject(gadget_expert);
  362.  
  363.         gadget_first=0;
  364.     }
  365. }
  366. //-------------------------------------
  367. void prefs_newsize(BOOL clr)
  368. {
  369.     struct TextFont *font=Scrn.tkfont.font;
  370.     struct RastPort *rp;
  371.     struct NewGadget new=
  372.     {
  373.         0, //ng_LeftEdge;
  374.         0, //ng_TopEdge;
  375.         0,    //ng_Width;
  376.         0,    //ng_Height;
  377.         0,                    //    ng_GadgetText;
  378.         0,                    //    ng_TextAttr;
  379.         0,                    // ng_GadgetID;
  380.         0,                    // ng_Flags;
  381.         Scrn.Visual,    //    ng_VisualInfo;
  382.         0                    //    ng_UserData;
  383.     };
  384.     text_order[0]=CatStr(TXT_PREFPOSITION);
  385.     text_order[1]=CatStr(TXT_PREFDESC);
  386.     text_order[2]=CatStr(TXT_PREFRANDOM);
  387.     text_order[3]=0;
  388.  
  389.     text_display[0]=CatStr(TXT_PREFCOLORS);
  390.     text_display[1]=CatStr(TXT_PREFLETTERS);
  391.     text_display[2]=0;
  392.  
  393.     if (window_prefs)
  394.     {
  395.         rp=window_prefs->RPort;
  396.  
  397.         prefs_freegadgets();
  398.  
  399.         CreateContext(&gadget_first);
  400.         {
  401.             ULONG x=window_prefs->BorderLeft;
  402.             ULONG y=window_prefs->BorderTop;
  403.             ULONG w=window_prefs->Width-window_prefs->BorderLeft-window_prefs->BorderRight;
  404.             ULONG h=window_prefs->Height-window_prefs->BorderTop-window_prefs->BorderBottom;
  405.             ULONG s,xc,yc,wc,hc;
  406.  
  407.             if (clr)
  408.             {
  409.                 EraseRect(rp,x,y,x+w-1,y+h-1);
  410.                 RefreshWindowFrame(window_prefs);
  411.             }
  412.  
  413.             x+=6;
  414.             y+=6;
  415.             w-=12;
  416.             h-=12;
  417.  
  418.             s=font->tf_YSize+6;
  419.             xc=x;
  420.             yc=y+s;
  421.             wc=(w-6)/2;
  422.             hc=14;
  423.  
  424.             new.ng_TextAttr=        &Scrn.tkfont.attr;
  425.             new.ng_LeftEdge=        xc;
  426.             new.ng_TopEdge=        yc;
  427.             new.ng_Width=            wc;
  428.             new.ng_Height=            hc;
  429.             new.ng_GadgetID=        ID_COLUMNS;
  430.     
  431.             gadget_columns = CreateGadget(SLIDER_KIND,gadget_first,&new,
  432.                 GA_Immediate,TRUE,
  433.                 GA_RelVerify,TRUE,
  434.                 GTSL_Level,cpy_prefs->game.num_columns,
  435.                 GTSL_Max,20,
  436.                 GTSL_Min,2,
  437.                 PGA_Freedom,LORIENT_HORIZ,
  438.                 GTSL_LevelFormat,CatStr(TXT_PREFCOLUMNS),
  439.                 GTSL_LevelPlace,PLACETEXT_ABOVE,
  440.                 GTSL_MaxLevelLen,12,
  441. //                GTSL_MaxPixelLen,wc,
  442.                 TAG_END);
  443.     
  444.             new.ng_LeftEdge=        xc+wc+6;
  445.             new.ng_TopEdge=        yc;
  446.             new.ng_Width=            wc;
  447.             new.ng_Height=            hc;
  448.             new.ng_GadgetID=        ID_COLORS;
  449.  
  450.             gadget_colors = CreateGadget(SLIDER_KIND,gadget_columns,&new,
  451.                 GA_Immediate,TRUE,
  452.                 GA_RelVerify,TRUE,
  453.                 GTSL_Level,cpy_prefs->game.num_colors,
  454.                 GTSL_Max,26,
  455.                 GTSL_Min,2,
  456.                 PGA_Freedom,LORIENT_HORIZ,
  457.                 GTSL_LevelFormat,CatStr(TXT_PREFSETCOLOR),
  458.                 GTSL_LevelPlace,PLACETEXT_ABOVE,
  459.                 GTSL_MaxLevelLen,12,
  460. //                GTSL_MaxPixelLen,wc,
  461.                 TAG_END);
  462.  
  463.             yc+=hc+s+6;
  464.             new.ng_LeftEdge=        xc+wc/2+3;
  465.             new.ng_TopEdge=        yc;
  466.             new.ng_Width=            wc;
  467.             new.ng_Height=            hc;
  468.             new.ng_GadgetID=        ID_EQUAL;
  469.  
  470.             gadget_equal = CreateGadget(SLIDER_KIND,gadget_colors,&new,
  471.                 GA_Immediate,TRUE,
  472.                 GA_RelVerify,TRUE,
  473.                 GTSL_Level,cpy_prefs->game.max_equal,
  474.                 GTSL_Max,20,
  475.                 GTSL_Min,1,
  476.                 PGA_Freedom,LORIENT_HORIZ,
  477.                 GTSL_LevelFormat,CatStr(TXT_PREFSETEQUAL),
  478.                 GTSL_LevelPlace,PLACETEXT_ABOVE,
  479.                 GTSL_MaxLevelLen,12,
  480. //                GTSL_MaxPixelLen,wc,
  481.                 TAG_END);
  482.  
  483.             yc+=hc+s+6;
  484.             new.ng_LeftEdge=        x;
  485.             new.ng_TopEdge=        yc;
  486.             new.ng_Width=            w;
  487.             new.ng_Height=            s;
  488.             new.ng_GadgetID=        ID_ORDER;
  489.             new.ng_GadgetText=    CatStr(TXT_PREFANSWER);
  490.             new.ng_Flags=            PLACETEXT_ABOVE;
  491.  
  492.             gadget_order = CreateGadget(CYCLE_KIND,gadget_equal,&new,
  493.                 GA_Immediate,TRUE,
  494.                 GA_RelVerify,TRUE,
  495.                 GTCY_Active,cpy_prefs->game.val_order,
  496.                 GTCY_Labels,text_order,
  497.                 TAG_END);
  498.  
  499.             yc+=s+s+6;
  500.             new.ng_LeftEdge=        x;
  501.             new.ng_TopEdge=        yc;
  502.             new.ng_Width=            w;
  503.             new.ng_Height=            s;
  504.             new.ng_GadgetID=        ID_DISPLAY;
  505.             new.ng_GadgetText=    CatStr(TXT_DISPLAYMODE);
  506.             new.ng_Flags=            PLACETEXT_ABOVE;
  507.  
  508.             gadget_display = CreateGadget(CYCLE_KIND,gadget_order,&new,
  509.                 GA_Immediate,TRUE,
  510.                 GA_RelVerify,TRUE,
  511.                 GTCY_Active,prg_prefs->game.display,
  512.                 GTCY_Labels,text_display,
  513.                 TAG_END);
  514.  
  515.             wc=(w-12)/3;
  516.  
  517.             yc+=s+12;
  518.             gadget_novice = NewObject (class_button,0,
  519.                 GA_Previous,gadget_display,
  520.                 GA_Left,x,
  521.                 GA_Top,yc,
  522.                 GA_Width,wc,
  523.                 GA_Height,s,
  524.                 GA_RelVerify,TRUE,
  525.                 GA_Text,CatStr(TXT_PREFBEGINNER),
  526.                 GA_ID,ID_NOVICE,
  527.                 GA_Font,font,
  528.                 TAG_END);
  529.  
  530.             gadget_amature = NewObject (class_button,0,
  531.                 GA_Previous,gadget_order,
  532.                 GA_Left,x+wc+6,
  533.                 GA_Top,yc,
  534.                 GA_Width,wc,
  535.                 GA_Height,s,
  536.                 GA_RelVerify,TRUE,
  537.                 GA_Text,CatStr(TXT_PREFAMATURE),
  538.                 GA_ID,ID_AMATURE,
  539.                 GA_Font,font,
  540.                 TAG_END);
  541.  
  542.             gadget_expert = NewObject (class_button,0,
  543.                 GA_Previous,gadget_order,
  544.                 GA_Left,x+2*wc+12,
  545.                 GA_Top,yc,
  546.                 GA_Width,wc,
  547.                 GA_Height,s,
  548.                 GA_RelVerify,TRUE,
  549.                 GA_Text,CatStr(TXT_PREFEXPERT),
  550.                 GA_ID,ID_EXPERT,
  551.                 GA_Font,font,
  552.                 TAG_END);
  553.  
  554.             gadget_newlook(gadget_first);
  555.         }
  556.         AddGList(window_prefs,gadget_first,-1,-1,0);
  557.         RefreshGList(gadget_first,window_prefs,0,-1);
  558.         GT_RefreshWindow(window_prefs,0);
  559.     }
  560. }
  561. //-------------------------------------
  562. void prefs_windowopen()
  563. {
  564.     if (!window_prefs)
  565.     {
  566.         prefs_copy(prg_prefs,cpy_prefs);
  567.  
  568.         window_prefs=OpenWindowTags(0,
  569.             WA_Title,CatStr(TXT_SCOREWINTITLE),
  570.     
  571.             WA_Left,prg_prefs->win.prefs.Xpos,
  572.             WA_Top,prg_prefs->win.prefs.Ypos,
  573.             WA_Width,prg_prefs->win.prefs.WinW,
  574.             WA_Height,prg_prefs->win.prefs.WinH,
  575.             (Scrn.Scrn && Scrn.FlgPublic==FALSE) ? WA_CustomScreen : WA_PubScreen,Scrn.Scrn,
  576.             WA_Flags,
  577.                     WFLG_ACTIVATE|
  578.                     WFLG_CLOSEGADGET|
  579.                     WFLG_DRAGBAR|
  580.                     WFLG_DEPTHGADGET|
  581.                     WFLG_NEWLOOKMENUS|
  582.                     WFLG_RMBTRAP|
  583.     //                WFLG_SIZEBBOTTOM|
  584.                     WFLG_SIZEBRIGHT|
  585.                     WFLG_SIZEGADGET|
  586.                     0,
  587.             WA_IDCMP,
  588.                     IDCMP_GADGETUP|
  589.                     IDCMP_CLOSEWINDOW|
  590.                     IDCMP_NEWSIZE|
  591.                     SLIDERIDCMP|
  592.                     0,
  593. //            WA_Zoom,0,
  594.             WA_AutoAdjust,TRUE,
  595.             WA_MaxWidth,-1,
  596.             WA_MaxHeight,-1,
  597.             WA_MinWidth,50,
  598.             WA_MinHeight,50,
  599.             TAG_END);
  600.     }
  601.     prefs_newsize(FALSE);
  602. }
  603. //-------------------------------------
  604. void prefs_windowclose()
  605. {
  606.     if (window_prefs)
  607.     {
  608.         prefs_freegadgets();
  609.  
  610.         window_close(window_prefs,&prg_prefs->win.prefs);
  611.         window_prefs=0;
  612.  
  613.         prefs_copy(cpy_prefs,prg_prefs);
  614.     }
  615. }
  616. //-------------------------------------
  617. void prefs_setwindow()
  618. {
  619.     GT_SetGadgetAttrs(gadget_columns,window_prefs,0,
  620.             GTSL_Level,cpy_prefs->game.num_columns,
  621.             TAG_END);
  622.  
  623.     GT_SetGadgetAttrs(gadget_colors,window_prefs,0,
  624.             GTSL_Level,cpy_prefs->game.num_colors,
  625.             TAG_END);
  626.  
  627.     GT_SetGadgetAttrs(gadget_equal,window_prefs,0,
  628.             GTSL_Level,cpy_prefs->game.max_equal,
  629.             TAG_END);
  630.  
  631.     GT_SetGadgetAttrs(gadget_order,window_prefs,0,
  632.             GTCY_Active,cpy_prefs->game.val_order,
  633.             TAG_END);
  634.  
  635. }
  636. //-------------------------------------
  637.  
  638.  
  639. //-------------------------------------
  640. void prefs_dogadget(ULONG id,ULONG code,ULONG qual)
  641. {
  642.     ULONG
  643.         colors=cpy_prefs->game.num_colors,
  644.         columns=cpy_prefs->game.num_columns,
  645.         equal=cpy_prefs->game.max_equal,
  646.         order=cpy_prefs->game.val_order,
  647.         display=cpy_prefs->game.display;
  648.  
  649.     switch (id)
  650.     {
  651.         case ID_COLORS:
  652.             colors=code;
  653.             break;
  654.         case ID_COLUMNS:
  655.             columns=code;
  656.             break;
  657.         case ID_EQUAL:
  658.             equal=code;
  659.             break;
  660.         case ID_ORDER:
  661.             order=code;
  662.             break;
  663.         case ID_DISPLAY:
  664.             display=code;
  665.             break;
  666.         case ID_NOVICE:
  667.             colors=6;
  668.             columns=4;
  669.             equal=1;
  670.             order=ORDER_POS;
  671.             break;
  672.         case ID_AMATURE:
  673.             colors=7;
  674.             columns=5;
  675.             equal=2;
  676.             order=ORDER_DESC;
  677.             break;
  678.         case ID_EXPERT:
  679.             colors=12;
  680.             columns=8;
  681.             equal=3;
  682.             order=ORDER_RANDOM;
  683.             break;
  684.     }
  685.  
  686.     cpy_prefs->game.num_colors=colors;
  687.     cpy_prefs->game.num_columns=columns;
  688.     cpy_prefs->game.max_equal=equal;
  689.     cpy_prefs->game.val_order=order;
  690.     cpy_prefs->game.display=display;
  691.  
  692.     prefs_setwindow();
  693. }
  694. //-------------------------------------
  695. LONG prefs_getbit()
  696. {
  697.     LONG bit=0;
  698.  
  699.     if (window_prefs)
  700.     {
  701.         bit=1 << window_prefs->UserPort->mp_SigBit;
  702.     }
  703.  
  704.     return bit;
  705. }
  706. //-------------------------------------
  707. VOID prefs_domsg()
  708. {
  709.     struct Window *win=window_prefs;
  710.     struct IntuiMessage *msg;
  711.  
  712.     struct Gadget *gadg;
  713.     LONG clas;
  714.     LONG code;
  715.     LONG qual;
  716.     LONG posx,posy,seco,micr;
  717.  
  718.     while (window_prefs && (msg=GT_GetIMsg(win->UserPort)))
  719.     {
  720.         gadg = (APTR)msg->IAddress;
  721.         clas = msg->Class;
  722.         code = msg->Code;
  723.         qual = msg->Qualifier;
  724.         posx = msg->MouseX;
  725.         posy = msg->MouseY;
  726.         seco = msg->Seconds;
  727.         micr = msg->Micros;
  728.  
  729.         GT_ReplyIMsg(msg);
  730.  
  731.         switch (clas)
  732.         {
  733.             case IDCMP_CHANGEWINDOW:
  734. //                Window_StoreSize(MsgBlk);
  735.                 break;
  736.             case IDCMP_RAWKEY:
  737.                 break;
  738.             case IDCMP_NEWSIZE:
  739.                 prefs_newsize(TRUE);
  740.                 break;
  741.             case IDCMP_MENUPICK:
  742. //                Command_Menu(,GadMsg.Code);
  743.                 break;
  744.             case IDCMP_CLOSEWINDOW:
  745.                 prefs_windowclose();
  746.                 break;
  747.             case IDCMP_GADGETUP:
  748.                 prefs_dogadget(gadg->GadgetID,code,qual);
  749.                 break;
  750.         }
  751.     }
  752. }
  753. //-------------------------------------
  754.  
  755. char prefs_file[]="PROGDIR:SuperCode.prefs";
  756. //-------------------------------------
  757. void prefs_save()
  758. {
  759.     struct tkfile *file;
  760.  
  761.     file = file_open(prefs_file,MODE_NEWFILE,FALSE);
  762.  
  763.     file_writelong(file,PREFSHEAD);
  764.     file_saveblock(file,INDGAME,VERGAME,sizeof(struct SetGame),&prg_prefs->game);
  765.     file_saveblock(file,INDSCREEN,VERSCREEN,sizeof(struct SetScreen),&prg_prefs->scr);
  766.     file_saveblock(file,INDWINDOW,VERWINDOW,sizeof(struct SetWindow),&prg_prefs->win);
  767.  
  768.     file_free(&file);
  769. }
  770. //-------------------------------------
  771. void prefs_load()
  772. {
  773.     struct tkfile *file;
  774.  
  775.     file = file_open(prefs_file,0,ASKFILE_CANTOPEN);
  776.  
  777.     if (file_readlong(file)==PREFSHEAD)
  778.     {
  779.         BOOL load=TRUE;
  780.         ULONG ind=0;
  781.  
  782.         while (load)
  783.         {
  784.             ind=file_readlong(file);
  785.             switch(ind)
  786.             {
  787.                 case INDGAME:
  788.                     file_loadblock(file,VERGAME,sizeof(struct SetGame),&prg_prefs->game);
  789.                     break;
  790.                 case INDSCREEN:
  791.                     file_loadblock(file,VERSCREEN,sizeof(struct SetScreen),&prg_prefs->scr);
  792.                     break;
  793.                 case INDWINDOW:
  794.                     file_loadblock(file,VERWINDOW,sizeof(struct SetWindow),&prg_prefs->win);
  795.                     break;
  796.                 default:
  797.                     load=FALSE;
  798.                     break;
  799.             }
  800.         }
  801.     }
  802.     file_free(&file);
  803. }
  804. //-------------------------------------
  805.  
  806.  
  807. //-------------------------------------
  808. /*
  809. //-------------------------------------
  810. LONG prefs_askpubscreen(UBYTE *name,LONG max)
  811. {
  812.     struct PubScreenRequest *pub=0;
  813.     LONG back=FALSE;
  814.  
  815.     pub=AllocPubScreenRequest();
  816.  
  817.     if (pub)
  818.     {
  819.         back=PubScreenRequest(pub);
  820.  
  821.         if (back)
  822.         {
  823.             prg_prefs->scr_public=TRUE;
  824.             StrCopy(name,pub->PubName,max);
  825.         }
  826.         FreePubScreenRequest(pub);
  827.     }
  828.  
  829.     return back;
  830. }
  831. //-------------------------------------
  832. void prefs_setpubscreen()
  833. {
  834.     if (prefs_askpubscreen(prg_prefs->scr_pubname,MAX_PUBSCREENNAME))
  835.     {
  836.         prefs_settext();
  837.         Screen_Open(&Scrn);
  838.     }
  839. }
  840. //-------------------------------------
  841. */
  842.